﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace myLittleC
{
    
    class Tokenizer
    {
        int line ;
        int pos;
        
        string useLine = "";
        
        StreamReader mComFile;

        public Token ActiveToken { get; private set; }
        public SubTokenType SubType { get { return ActiveToken.SubType; } }
        public TokenType TokenType { get { return ActiveToken.Type; } }
        public TPosition Position { get { return ActiveToken.Position; } }

        public Tokenizer(string file)
        {
            Array.Sort(mKeyWords);
            Array.Sort(mDeviders);
            mComFile = new StreamReader(file);
            getNextToken();
        }

        public Token getNextToken()
        {
            NextToken();
            return ActiveToken;
        }

        public void NextToken() 
        {
            char aC='\0';
            String buf="";
            int condition =0;
            int newCondition = 0;

            while ((newCondition != (int)CONDITIONS.UnGet) && (newCondition != (int)CONDITIONS.Get) &&
                    (newCondition != (int)CONDITIONS.Error) && (newCondition != (int)CONDITIONS.ErrorInConst))
	        {
		        if (aC == '\n' || useLine.Length == 0 || pos == useLine.Length)
                {
                    line++;
                    useLine = mComFile.ReadLine();
                    pos = 0;
                    
                    if (useLine != null) useLine += '\n';
                    else
                    {
                        condition = getNextCondition(condition,(char)0);
                        break;
                    }
                }

		        condition = newCondition;
                aC = useLine[pos];
		        
		        newCondition = getNextCondition(condition, aC);

                if ((newCondition != 0) && (newCondition != (int)CONDITIONS.CommentOdn) &&
                    (newCondition != (int)CONDITIONS.CommentMnog) )
                    buf += aC;
                else buf = "";

		        pos++;
	        }

            if ((buf.Length > 1) && (newCondition != (int)CONDITIONS.Get))
		        buf = buf.Remove(buf.Length - 1);
            
            ActiveToken = new Token(buf, buf, new TPosition(line, pos - buf.Length  + (buf.Length != 0 && buf[buf.Length-1] == '\"' ? 1:0)));
	        
            switch ((CONDITIONS)condition)
	        {
                case CONDITIONS.IntHexConst:
                    if (newCondition == (int)CONDITIONS.ErrorInConst)
                        throw new ComExeption(ERRORS.InvalidConstFloat, new TPosition(line, pos));

                    ActiveToken.SubType = SubTokenType.CTT_INT;

                    try { ActiveToken.Value = Int32.Parse(buf.Substring(2),  System.Globalization.NumberStyles.AllowHexSpecifier); }
                    catch (System.Exception) { throw new ComExeption(ERRORS.InvalidConstInt, new TPosition(line, pos)); }
                    
                    break;
                 case CONDITIONS.IntConst:
                    if (newCondition == (int) CONDITIONS.ErrorInConst)
                        throw new ComExeption(ERRORS.InvalidConstFloat, new TPosition(line, pos));
     			   
                    ActiveToken.SubType = SubTokenType.CTT_INT;                

                    try { ActiveToken.Value = Convert.ToInt32(buf);}
                    catch (System.Exception) { throw new ComExeption(ERRORS.InvalidConstInt, new TPosition(line, pos));}
                    
		        break;            
                
                case CONDITIONS.FloatConst:
                case CONDITIONS.FloatConst + 1:
                case CONDITIONS.FloatConst + 2:
                case CONDITIONS.FloatConst + 3:
                    if (newCondition == (int) CONDITIONS.ErrorInConst)
                        throw new ComExeption(ERRORS.InvalidConstFloat, new TPosition(line, pos));

                    String S = System.Threading.Thread.CurrentThread.CurrentCulture.NumberFormat.NumberDecimalSeparator.ToString();
                    buf = buf.Replace(".", S);
                    
                    ActiveToken.SubType = SubTokenType.CTT_FLOAT; 
                    try  {   ActiveToken.Value = Convert.ToSingle(buf);}
                    catch (System.Exception)
                    {   throw new ComExeption(ERRORS.InvalidConstFloat, new TPosition(line, pos));}
                    
		        break;

                case CONDITIONS.Identifier:
                    ActiveToken.SubType = (Array.BinarySearch(mKeyWords, buf) < 0) ?SubTokenType.Identeficator :  SubTokenType.ResWord;
		        break;
                case CONDITIONS.ZNAK_OPERACII_ONE:
                case CONDITIONS.ZNAK_OPERACII_TWO:
		            switch (buf[0])
		            {
		                case '*': ActiveToken.SubType = (buf.Length > 1) ? SubTokenType.MultiplyAssigment : SubTokenType.Multiply; break;
		                case '%': ActiveToken.SubType = (buf.Length > 1) ? SubTokenType.DivAssigment : SubTokenType.Div; break;
		                case '!': ActiveToken.SubType = (buf.Length > 1) ? SubTokenType.NotEqual : SubTokenType.Not; break;
		                case '=': ActiveToken.SubType = (buf.Length > 1) ? SubTokenType.Equal : SubTokenType.Assignment; break;
		            }		        
		        break;

                case CONDITIONS.Or: 
                    ActiveToken.SubType = (buf.Length > 1) ? SubTokenType.OrAssignment : SubTokenType.Or;
                break;
                case CONDITIONS.Division: 
                    ActiveToken.SubType = (buf.Length > 1) ? SubTokenType.DivisionAssignment : SubTokenType.Division; 
		        break;           
                case CONDITIONS.LogicalOr: ActiveToken.SubType = SubTokenType.LogicalOr;  break;
                case CONDITIONS.And: ActiveToken.SubType = (buf.Length > 1) ? SubTokenType.AndAssignment : SubTokenType.And;  break;
                case CONDITIONS.LogicalAnd: ActiveToken.SubType = SubTokenType.LogicalAnd; break;
                case CONDITIONS.Dot: ActiveToken.SubType = SubTokenType.Dot; break;
                case CONDITIONS.Separator: 
                    ActiveToken.SubType = (SubTokenType)(Array.BinarySearch(mDeviders, buf) + (int)SubTokenType.SEPORATOR_START + 1);
                break;            
                case CONDITIONS.StringConst:
                    if (newCondition == (int)CONDITIONS.ErrorInConst)
                        throw new ComExeption(ERRORS.InvalidConstString, new TPosition(line, pos));
                    ActiveToken.SubType = SubTokenType.CTT_STR;
 		            ActiveToken.Value = replaseEscSeq(buf);
		        break;
                case CONDITIONS.Add: ActiveToken.SubType = SubTokenType.Add; break;
                case CONDITIONS.Increment: ActiveToken.SubType = SubTokenType.Increment; break;
                case CONDITIONS.AddAssignment: ActiveToken.SubType = SubTokenType.AddAssignment; break;
                case CONDITIONS.Substraction: ActiveToken.SubType = SubTokenType.Sub; break;
                case CONDITIONS.Decrement: ActiveToken.SubType = SubTokenType.Decrement; break;
                case CONDITIONS.SubAssignment: ActiveToken.SubType = SubTokenType.SubAssignment; break;
                case CONDITIONS.Low: ActiveToken.SubType = SubTokenType.Low; break;
                case CONDITIONS.SHL: ActiveToken.SubType = SubTokenType.SHL; break;
 	            case CONDITIONS.LowOrEq: ActiveToken.SubType = SubTokenType.LowOrEq; break;
                case CONDITIONS.Hi: ActiveToken.SubType = SubTokenType.Hi; break;
                case CONDITIONS.SHR: ActiveToken.SubType = SubTokenType.SHR; break;
                case CONDITIONS.HiOrEq: ActiveToken.SubType = SubTokenType.HiOrEq; break;
                case CONDITIONS.EOF: ActiveToken.SubType = SubTokenType.EOF; break;
                case (CONDITIONS)CONDITIONS.ErrorEofComment:
                    throw new ComExeption(ERRORS.EOF, new TPosition(line, pos));                   
	            default:
                    throw new ComExeption(ERRORS.UnknownError, new TPosition(line, pos));		            
	            }

            if (newCondition != (int)CONDITIONS.Get) pos--;
         }

        static public String StringOperation(SubTokenType Operation)  
        {
            if (Operation <= SubTokenType.OperationsStart || Operation >= SubTokenType.OperationsEnd)
                throw new ComExeption(ERRORS.UnknownError);
            return Tokenizer.mOperations[Operation - SubTokenType.OperationsStart - 1]; 
        }

       
        String replaseEscSeq(String buf)
        {
            string str = "";

            for (int pos = buf.IndexOf('\\'); pos < buf.Length && pos > -1; pos = buf.IndexOf('\\'))
            {
                str += buf.Substring(0, pos);
                buf = buf.Remove(0, pos);

                switch (buf[1])
                {
                    case 'a': str += '\a'; break;
                    case 'b': str += '\b'; break;
                    case 'n': str += '\n'; break;
                    case 'r': str += '\r'; break;
                    case 't': str += '\t'; break;
                    case '\\': str += '\\'; break;
                    case '\"': str += '\"'; break;
                    case '\'': str += '\''; break;
                    default: throw new ComExeption(ERRORS.InvalidEscSeq, Position);
                }

                buf = buf.Remove(0, 2);

            }
            str += buf;
            return str.Substring(1, str.Length - 2);
        }

        int getNextCondition(int condition, char aC)
        {
            if ((aC + 1) > 127)
                return (int)CONDITIONS.Get;

            return table[condition, aC + 1];
        }

        static String[] mKeyWords = { "else", "return", "const", "printf", "for", "void", "do", "if", "while", "array", "procedure", "var", "Struct", "struct", "int", "float" };
        static String[] mDeviders = { ",", ":", ";", "(", ")", "[", "]", "{", "}" };
        static public String[] mOperations = { "++", "--", "!", "*", "/", "%", "+", "-", "<<", ">>", "<", ">", "<=", ">=", "==", "!=", "&", "|", "&&", "||", "=", "+=", "-=", "|=", "&=", "*=", "/=", ".", "%=", };

        static int[,] table = 
        {
        //0  EOF  '\0' 1    2    3    4    5    6    \a   '\b' '\t' '\n' \v   \f   '\r' 14   15   16   17   18   19   20   21   22   23   24   25   26   27   28   29   30   31   ' '  '!'  '"'  '#'  '$'  '%'  '&'  '''  '('  ')'  '*'  '+'  ','  '-'  '.'  '/'  '0'  '1'  '2'  '3'  '4'  '5'  '6'  '7'  '8'  '9'  ':'  ';'  '<'  '='  '>'  '?'  '@'  'A'  'B'  'C'  'D'  'E'  'F'  'G'  'H'  'I'  'J'  'K'  'L'  'M'  'N'  'O'  'P'  'Q'  'R'  'S'  'T'  'U'  'V'  'W'  'X'  'Y'  'Z'  '['  '\'  ']'  '^'  '_'  '`'  'a'  'b'  'c'  'd'  'e'  'f'  'g'  'h'  'i'  'j'  'k'  'l'  'm'  'n'  'o'  'p'  'q'  'r'  's'  't'  'u'  'v'  'w'  'x'  'y'  'z'  '{'  '|'  '}'  '~'
            {20  ,20  ,201 ,201 ,201 ,201 ,201 ,201 ,201 ,201 ,  0 , 0  ,201 ,201 , 0  ,201 ,201 ,201 ,201 ,201 ,201 ,201 ,201 ,201 ,201 ,201 ,201 ,201 ,201 ,201 ,201 ,201 ,201 ,0   ,7   ,18  ,201 ,201 ,7   ,13  ,201 ,15  ,15  ,7   ,22  ,15  ,25  ,34  ,9   ,40  ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,15  ,15  ,28   ,7  ,31  ,201 ,201 ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,15  ,201 ,15  ,201 ,6   ,201 ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,15  ,11  ,15  ,201 ,},	//пробелы	(+,-,>,< сделать для каждой отдельную проверку, т.к. каждый из них м.б. использован удвоенным - типа ++ )
            {201 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,203 ,203 ,203 ,200 ,200 ,203 ,200 ,200 ,200 ,200 ,200 ,200 ,2   ,200 ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,1   ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,203 ,203 ,203 ,203 ,3   ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,200 ,200 ,200 ,200 ,203 ,200 ,203 ,203 ,203 ,203 ,3   ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,200 ,200 ,200 ,200 ,200 ,},	//целочисленная константа
            {201 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,2   ,2   ,2   ,2   ,2   ,2   ,2   ,2   ,2   ,2   ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,203 ,203 ,203 ,203 ,3   ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,200 ,200 ,200 ,200 ,203 ,200 ,203 ,203 ,203 ,203 ,3   ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,200 ,200 ,200 ,200 ,200 ,},	//вещественная константа
            {201 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,203 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,4   ,200 ,200 ,5   ,5   ,5   ,5   ,5   ,5   ,5   ,5   ,5   ,5   ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,},	//нашли у неё е/Е ищем -
            {201 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,203 ,200 ,200 ,5   ,5   ,5   ,5   ,5   ,5   ,5   ,5   ,5   ,5   ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,},	//нашли у неё - ищем цифры если не нашли то unget
            {201 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,5   ,5   ,5   ,5   ,5   ,5   ,5   ,5   ,5   ,5   ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,200 ,200 ,200 ,200 ,203 ,200 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,203 ,200 ,200 ,200 ,200 ,200 ,},	//иначе ищем все цифры
        //6	
            {200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,200 ,200 ,200 ,200 ,6   ,200 ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,6   ,200 ,200 ,200 ,200 ,},	//идентификаторы
        //7	
            {200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,201 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,},	//знаки операций
            {201 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,}, //пустая строка для выхода
        //9
            {200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,16  ,200 ,200 ,200 ,200 ,10  ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,201 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,},	//нашли знак '/'
            {201 ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,0   ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,10  ,},	//пропускаем всё кроме переноса строки и конца файла
        //11
            {200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,201 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,12  ,200 ,200 ,},	//знак ||
            {201 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,},
        //13
            {200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,14  ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,201 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,},	//знак &&
            {201 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,},
        //15
            {201 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,},	//разделители
        //16
            {204 ,204 ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,17  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,},	//многострочный комментарий
            {201 ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,0   ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,16  ,},
        //18
            {19  ,19  ,19  ,19  ,19  ,19  ,19  ,19  ,19  ,19  ,18  ,203  ,19  ,19  ,18  ,19  ,19  ,19  ,19  ,19  ,19  ,19  ,19  ,19  ,19  ,19  ,19  ,19  ,19  ,19  ,19  ,19  ,19  ,18  ,18  ,201 ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,21  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,},	//строковые константы
            {201 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,},
        //20 EOF  '\0' 1    2    3    4    5    6    7    '\b' '\t' '\n' 11   \f   '\r' 14   15   16   17   18   19   20   21   22   23   24   25   26   27   28   29   30   31   ' '  '!'  '"'  '#'  '$'  '%'  '&'  '''  '('  ')'  '*'  '+'  ','  '-'  '.'  '/'  '0'  '1'  '2'  '3'  '4'  '5'  '6'  '7'  '8'  '9'  ':'  ';'  '<'  '='  '>'  '?'  '@'  'A'  'B'  'C'  'D'  'E'  'F'  'G'  'H'  'I'  'J'  'K'  'L'  'M'  'N'  'O'  'P'  'Q'  'R'  'S'  'T'  'U'  'V'  'W'  'X'  'Y'  'Z'  '['  '\'  ']'  '^'  '_'  '`'  'a'  'b'  'c'  'd'  'e'  'f'  'g'  'h'  'i'  'j'  'k'  'l'  'm'  'n'  'o'  'p'  'q'  'r'  's'  't'  'u'  'v'  'w'  'x'  'y'  'z'  '{'  '|'  '}'  '~'
            {202 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,},
        //21	
            {19  ,19  ,19  ,19  ,19  ,19  ,19  ,19  ,19  ,19  ,18  ,18  ,19  ,19  ,18  ,19  ,19  ,19  ,19  ,19  ,19  ,19  ,19  ,19  ,19  ,19  ,19  ,19  ,19  ,19  ,19  ,19  ,19  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,18  ,},
        //22	
            {201 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,23  ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,24  ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,},	//adding
            {200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,},	//increment
            {200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,},	//adding self
        //25
            {200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,26  ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,27  ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,},	//substraction
            {200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,},	//decrement
            {200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,},	//substraction self
        //28
            {200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,29  ,30  ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,},	//low
            {200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,},	//shl
            {200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,},	//low_or_eq
        //31
            {200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,33  ,32  ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,},	//hi
            {200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,},	//shr
            {200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,},	//hi_or_eq
        //34
            {200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,2   ,2   ,2   ,2   ,2   ,2   ,2   ,2   ,2   ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,},	//dot
            {200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,},
            {200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,},
            {200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,},
            {200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,},
            {200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,},
        //40 EOF  '\0' 1    2    3    4    5    6    7    '\b' '\t' '\n' 11   \f   '\r' 14   15   16   17   18   19   20   21   22   23   24   25   26   27   28   29   30   31   ' '  '!'  '"'  '#'  '$'  '%'  '&'  '''  '('  ')'  '*'  '+'  ','  '-'  '.'  '/'  '0'  '1'  '2'  '3'  '4'  '5'  '6'  '7'  '8'  '9'  ':'  ';'  '<'  '='  '>'  '?'  '@'  'A'  'B'  'C'  'D'  'E'  'F'  'G'  'H'  'I'  'J'  'K'  'L'  'M'  'N'  'O'  'P'  'Q'  'R'  'S'  'T'  'U'  'V'  'W'  'X'  'Y'  'Z'  '['  '\'  ']'  '^'  '_'  '`'  'a'  'b'  'c'  'd'  'e'  'f'  'g'  'h'  'i'  'j'  'k'  'l'  'm'  'n'  'o'  'p'  'q'  'r'  's'  't'  'u'  'v'  'w'  'x'  'y'  'z'  '{'  '|'  '}'  '~'
            {200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,40  ,40 , 40  ,40 , 40 , 40 , 40,  40, 200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 , 41 ,200 ,200 ,200 ,200 ,200 ,200 ,},// восьмеричные целые числа
            {200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,41  ,41 , 41  ,41 , 41 , 41 , 41,  41,  41 , 41 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,41  ,41  ,41  ,41  ,41  ,41  ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,41  ,41  ,41  ,41  ,41  ,41  ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,200 ,},
        };    
    }
}
